2.17 Rekursives Programmieren
 
Funktionen und Prozeduren können sich selbst aufrufen. Diese Selbstaufrufe werden rekursives Programmieren genannt. Normalerweise wird in einer Bedingung etwas geprüft. Ist die Bedingung noch nicht ganz erfüllt, dann ruft die Funktion sich selbst auf. Erst wenn alle »Unterelemente« abgearbeitet sind, wird die Funktion oder Prozedur verlassen.
Ein Beispiel dafür ist die Quersumme und die Endquersumme. Die Quersumme berechnet sich als Summe der einzelnen Ziffern einer Zahl. Beispielsweise ist die Quersumme von 5 = 5, die Quersumme von 12 ist 3 und die Quersumme von 1.492 ist 16. Die Eigenschaft Lenghth zählt die Zeichen und übergibt nun in einer For...Next-Schleife jede einzelne Ziffer (Substring(dblZähler, 1)), die aus der Zahl herausgelöst wird, an die Variable dblInkrement. Diese werden eingesammelt (dblÜbergabewert) und zum Schluss wieder zurückgegeben.
Function Quersumme(Zahl As Double) As Long
Dim dblÜbergabewert As Double = 0
Dim dblInkrement As Double = 0
Dim dblZähler As Long
For dblZähler = 0 To Zahl.ToString.Length - 1
dblInkrement = _
CType(Zahl.ToString.Substring(dblZähler, 1), _
Double)
dblÜbergabewert = dblÜbergabewert + dblInkrement
Next
Return dblÜbergabewert
End Function
Abbildung 2.48
Die Quersumme von 1234567890
Das folgende Beispiel funktioniert rekursiv: die Endquersumme. Um eine Funktion zu programmieren, welche die Endquersumme berechnet, könnte eine zweite Funktion die erste benutzerdefinierte Funktion Quersumme so lange aufrufen, bis das Ergebnis der benutzerdefinierten Funktion EndQuersumme kleiner als 10 ist. Oder die Funktion EndQuersumme ruft sich selbst so lange auf, bis das Ergebnis < 10 ist:
Function EndQuersumme(Zahl) As Long
Dim dblÜbergabewert As Double
Dim dblInkrement As Double
Dim dblZähler As Long
dblÜbergabewert = 0
dblInkrement = 0
For dblZähler = 0 To Zahl.ToString.Length -1
dblInkrement = _
CType(Zahl.ToString.Substring(dblZähler, 1), _
Double)
dblÜbergabewert = dblÜbergabewert + dblInkrement
Next
If dblÜbergabewert > 9 Then
dblÜbergabewert = EndQuersumme(dblÜbergabewert)
End If
Return dblÜbergabewert
End Function
Abbildung 2.49
Quersumme und Endquersumme
Die Funktion ruft sich so lange selbst auf, bis alle »Werte aufgebraucht sind«, das heißt, bis die endgültige Summe einen Wert erreicht hat, der kleiner als 10 ist. Beliebte Beispiele für rekursive Funktionen sind Fakultäten (multipliziere alle Zahlen von 1 bis n miteinander) oder die Fibonacci-Reihe.
Vielleicht fragt sich der Leser nun, wer denn so etwas braucht. Die Antwort ist einfach: Manchmal müssen Ordner und Unterordner nach etwas durchsucht werden, ohne dass die Tiefe der Ordnerstruktur bekannt ist. Dafür benötigt man solche Programme. Ein anderes Anwendungsbeispiel ist die Möglichkeit, in Grafikprogrammen Gruppen von Objekten zu bilden. Diese können wiederum mit anderen Objekten gruppiert werden und so weiter. Will man nun per Programmierung auf alle Elemente zugreifen, dann muss man die Objekte der äußeren Gruppe daraufhin überprüfen, ob es sich um Gruppen handelt. Falls ja, muss man bei allen Elementen überprüfen, ob es sich um eine Gruppe handelt und so weiter.
Vielleicht sind rekursive Programme in der Praxis selten, aber sie tauchen auf. Und deshalb hat unser Endquersummen-Programm seine Berechtigung.
Bisher sind schon einige Begriffe gefallen, die noch erläutert werden sollen. Auf geht´s.
|